#include <opencv2/opencv.hpp>
#include <iostream>

// 二进制通信相关接口
cv::Scalar binary_encode(int msg) {
    if (msg == 1) {
        return cv::Scalar(0, 0, 0); // 黑色表示 1
    } else {
        return cv::Scalar(255, 255, 255); // 白色表示 0
    }
}

int binary_decode(cv::Scalar color) {
    if (color[0] == 0 && color[1] == 0 && color[2] == 0) {
        return 1;
    } else {
        return 0;
    }
}

// 八进制通信相关接口
cv::Scalar octal_encode(int msg) {
    switch (msg) {
        case 0: return cv::Scalar(0, 0, 0); // 黑色
        case 1: return cv::Scalar(255, 255, 255); // 白色
        case 2: return cv::Scalar(0, 0, 255); // 红色
        case 3: return cv::Scalar(255, 0, 0); // 蓝色
        case 4: return cv::Scalar(0, 255, 0); // 绿色
        case 5: return cv::Scalar(255, 0, 255); // 紫色
        case 6: return cv::Scalar(0, 255, 255); // 黄色
        case 7: return cv::Scalar(255, 255, 0); // 青色
        default: return cv::Scalar(0, 0, 0);
    }
}

int octal_decode(cv::Scalar color) {
    if (color[0] == 0 && color[1] == 0 && color[2] == 0) return 0;
    if (color[0] == 255 && color[1] == 255 && color[2] == 255) return 1;
    if (color[0] == 0 && color[1] == 0 && color[2] == 255) return 2;
    if (color[0] == 255 && color[1] == 0 && color[2] == 0) return 3;
    if (color[0] == 0 && color[1] == 255 && color[2] == 0) return 4;
    if (color[0] == 255 && color[1] == 0 && color[2] == 255) return 5;
    if (color[0] == 0 && color[1] == 255 && color[2] == 255) return 6;
    if (color[0] == 255 && color[1] == 255 && color[2] == 0) return 7;
    return -1;
}

// 通用发送和接收接口
void send(int msg, bool is_binary) {
    cv::Scalar color;
    if (is_binary) {
        color = binary_encode(msg);
    } else {
        color = octal_encode(msg);
    }
    cv::Mat image = cv::Mat::zeros(100, 100, CV_8UC3);
    image = color;
    cv::imshow("Transmitter", image);
    cv::waitKey(1000); // 显示 1 秒
}

int receive(bool is_binary) {
    cv::Mat frame;
    cv::VideoCapture cap(0); // 打开摄像头
    if (!cap.isOpened()) {
        std::cerr << "无法打开摄像头" << std::endl;
        return -1;
    }
    cap >> frame;
    if (frame.empty()) {
        std::cerr << "无法获取图像" << std::endl;
        return -1;
    }
    cv::Scalar color = frame.at<cv::Vec3b>(frame.rows / 2, frame.cols / 2);
    int decoded_msg;
    if (is_binary) {
        decoded_msg = binary_decode(color);
    } else {
        decoded_msg = octal_decode(color);
    }
    cap.release();
    return decoded_msg;
}

int main() {
    // 二进制通信测试
    int binary_msg = 1;
    std::cout << "发送二进制消息: " << binary_msg << std::endl;
    send(binary_msg, true);
    int received_binary_msg = receive(true);
    std::cout << "接收到的二进制消息: " << received_binary_msg << std::endl;

    // 八进制通信测试
    int octal_msg = 5;
    std::cout << "发送八进制消息: " << octal_msg << std::endl;
    send(octal_msg, false);
    int received_octal_msg = receive(false);
    std::cout << "接收到的八进制消息: " << received_octal_msg << std::endl;

    return 0;
}